import router, { asyncRoutes, constantRoutes, } from '@/router'
import Layout from '@/layout'
import auth from '@/plugins/auth'
import {getRouters} from '@/api/user'
const state = {
  routes: [],
  newRoutes:[],
  addRoutes: [],
  defaultRoutes: [],
  topbarRouters: [],
  sidebarRouters: []
}

/**
 * Use meta.role to determine if the current user has permission
 * @param roles
 * @param route
 */
// function hasPermission(roles, route) {
//   if (route.meta && route.meta.roles) {
//     return roles.some(role => route.meta.roles.includes(role))
//   } else {
//     return true
//   }
// }

// 遍历后台传来的路由字符串，转换为组件对象
function filterAsyncRouter(asyncRouterMap, lastRouter = false, type = false) {
  return asyncRouterMap.filter(route => {
    if (type && route.children) {
      route.children = filterChildren(route.children)
    }
    // if (route.component) {
    //   // Layout ParentView 组件特殊处理
    //   if (route.component === 'Layout') {
    //     route.component = Layout
    //   }else {
    //     route.component = loadView(route.component)
    //   }
    // }
    if (route.children != null && route.children && route.children.length) {
      route.children = filterAsyncRouter(route.children, route, type)
    } else {
      delete route['children']
      delete route['redirect']
    }
    return true
  })
}

function filterChildren(childrenMap, lastRouter = false) {
  var children = []
  childrenMap.forEach((el, index) => {
    if (el.children && el.children.length) {
      if (el.component === 'ParentView' && !lastRouter) {
        el.children.forEach(c => {
          c.path = el.path + '/' + c.path
          if (c.children && c.children.length) {
            children = children.concat(filterChildren(c.children, c))
            return
          }
          children.push(c)
        })
        return
      }
    }
    if (lastRouter) {
      el.path = lastRouter.path + '/' + el.path
      if (el.children && el.children.length) {
        children = children.concat(filterChildren(el.children, el))
        return
      }
    }
    children = children.concat(el)
  })
  return children
}
function hasPermission(grantedPolicies, route) {
  // console.log(grantedPolicies, '--');
  if (route.meta && route.meta.policy) {
    const policy = route.meta.policy
    if (policy.includes('||')) {
      const arr = policy.split('||')
      for (let i = 0; i < arr.length; i++) {
        if (grantedPolicies[arr[i]]) {
          return true
        }
      }
      return false
    } else if (policy.includes('&&')) {
      const arr = policy.split('&&')
      for (let i = 0; i < arr.length; i++) {
        if (!grantedPolicies[arr[i]]) {
          return false
        }
      }
      return true
    } else {
      // console.log('grantedPolicies[policy]',grantedPolicies[policy]==true)
      return grantedPolicies[policy]
    }
  } else {
    return true
  }
  // policy 为数组的方法 --test 中
  // if (route.meta && route.meta.policy) {
  //   const policy = route.meta.policy
  //   if (policy.legnth > 0) {
  //     policy.map(item => {
  //       return grantedPolicies[item]
  //     })
  //   }
  //   return grantedPolicies[policy]
  // } else {
  //   return true
  // }
}
/**
 * Filter asynchronous routing tables by recursion
 * @param routes asyncRoutes
 * @param roles
 */
// export function filterAsyncRoutes(routes, roles) {
export function filterAsyncRoutes(routes, grantedPolicies) {
  const res = []

  // console.log('routes',routes,'grantedPolicies',grantedPolicies)
  routes.forEach(route => {
    const tmp = { ...route }
    if (hasPermission(grantedPolicies, tmp)) {
      // console.log('tmp',tmp)
      if (tmp.children) {
        tmp.children = filterAsyncRoutes(tmp.children, grantedPolicies)
      }
      if (route.meta && route.meta.policy === '') {
        if (tmp.children.length > 0) {
          res.push(tmp)
        }
      } else {
        res.push(tmp)
      }
    }
  })
  // console.log('res',res)
  // console.log('filterAsyncRoutes', res)
  return res
}

// 动态路由遍历，验证是否具备权限
export function filterDynamicRoutes(routes) {
  const res = []
  routes.forEach(route => {
    if (route.permissions) {
      if (auth.hasPermiOr(route.permissions)) {
        res.push(route)
      }
    } else if (route.roles) {
      if (auth.hasRoleOr(route.roles)) {
        res.push(route)
      }
    }
  })
  return res
}
const mutations = {
  SET_ROUTES: (state, routes) => {
    state.addRoutes = routes
    state.routes = constantRoutes.concat(routes)
    // console.log('state.routes',state.routes)
  },
  SET_NEWROUTES: (state, routes) => {
    state.newRoutes = routes
    // state.newRoutes = constantRoutes.concat(routes)
  },
  SET_DEFAULT_ROUTES: (state, routes) => {
    state.defaultRoutes = constantRoutes.concat(routes)
  },
  SET_TOPBAR_ROUTES: (state, routes) => {
    state.topbarRouters = routes
  },
  SET_SIDEBAR_ROUTERS: (state, routes) => {
    state.sidebarRouters = routes
  },
}

const actions = {
  // generateRoutes({ commit }, roles) {
  //   return new Promise(resolve => {
  //     let accessedRoutes
  //     if (roles.includes('admin')) {
  //       accessedRoutes = asyncRoutes || []
  //     } else {
  //       accessedRoutes = filterAsyncRoutes(asyncRoutes, roles)
  //     }
  //     commit('SET_ROUTES', accessedRoutes)
  //     resolve(accessedRoutes)
  //   })
  // }
  generateRoutes({ commit }, grantedPolicies) {
    return new Promise(resolve => {
      const accessedRoutes = filterAsyncRoutes(asyncRoutes, grantedPolicies)
      commit('SET_ROUTES', accessedRoutes)
      resolve(accessedRoutes)
      // }
    })
  },
   // 生成路由
   GenerateRoutes({ commit }) {
    return new Promise(resolve => {
      // 向后端请求路由数据
      getRouters().then(res => {
      
      
        const sdata = JSON.parse(JSON.stringify(res.data))
        const rdata = JSON.parse(JSON.stringify(res.data))
       
      commit('SET_NEWROUTES', rdata)
      
        const sidebarRoutes = filterAsyncRouter(sdata)
        // const rewriteRoutes = filterAsyncRouter(rdata, false, true)
        // const asyncRoutes = filterDynamicRoutes(dynamicRoutes);
        // rewriteRoutes.push({ path: '*', redirect: '/404', hidden: true })
        // router.addRoutes(asyncRoutes);
        // commit('SET_ROUTES', rewriteRoutes)
        commit('SET_SIDEBAR_ROUTERS', constantRoutes.concat(sidebarRoutes))
        // commit('SET_DEFAULT_ROUTES', sidebarRoutes)
        // commit('SET_TOPBAR_ROUTES', sidebarRoutes)
        // resolve(rewriteRoutes)
        resolve(res.data)
      })
    })
  }
}

export default {
  namespaced: true,
  state,
  mutations,
  actions
}
